﻿using System.Collections.Generic;

namespace TwinHead.Frameworks.Morph.Tokens
{
    /// <summary>
    /// 토큰 스트림
    /// </summary>
    public abstract class TokenStream : ITokenStream
    {
        /// <summary>
        /// 현재 토큰의 위치를 알려주는 인덱스
        /// </summary>
        protected int  tokenIndex = -1;

        /// <summary>
        /// 토큰들의 원본 문자열을 반환합니다.
        /// </summary>
        public abstract string SourceString
        {
            get;
        }
        /// <summary>
        /// 분해된 토큰의 개수를 반환합니다.
        /// </summary>
        public abstract int TokenCount
        {
            get;
        }
        /// <summary>
        /// 현재 스트림에 저장된 Token의 목록을 반환합니다.
        /// </summary>
        public abstract IList<IToken> Tokens
        {
            get;
        }
        /// <summary>
        /// 다음 토큰요소를 반환합니다.
        /// </summary>
        /// <returns>없을 경우 null 반환</returns>
        public abstract IToken Next();

        /// <summary>
        /// 이전 토큰요소를 반환합니다.
        /// </summary>
        /// <returns>없을 경우 null 반환</returns>
        public abstract IToken Prev();

        /// <summary>
        /// 현재 설정된 토큰요소를 반환합니다.
        /// </summary>
        /// <returns></returns>
        public abstract IToken Current();

        /// <summary>
        /// 제일 처음 토큰요소를 반환합니다.
        /// </summary>
        /// <returns></returns>
        public abstract IToken First();

        /// <summary>
        /// 제일 마지막 토큰요소를 반환합니다.
        /// </summary>
        /// <returns></returns>
        public abstract IToken Last();
    }
}
